home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok12
/
module
/
textwindow.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
13KB
|
564 lines
(*---------------------------------------------------------------------------
:Program. TextWindow.mod
:Author. Bernd Preusing
:Address. Gerhardstr. 16 D-2200 Elmshorn
:Phone. 04121/22486
:Shortcut. [bep]
:Version. 1.1
:Date. 20-Apr-88
:Copyright. PD
:Language. Modula-II
:Translator. M2Amiga
:Imports. none
:Cofiles. HiTab.asm [bep] for INLINE HiKeyMap
:Contents. TextIO on an own screen like m2emacs
:Remark.
---------------------------------------------------------------------------*)
IMPLEMENTATION MODULE TextWindow;
FROM SYSTEM IMPORT
ADR, ADDRESS, CAST, LONGSET, SHIFT, INLINE;
FROM Arts IMPORT
TermProcedure, Assert;
FROM Intuition IMPORT NewScreen, NewWindow, ScreenPtr, WindowPtr,
Screen, Window, WindowFlags, IDCMPFlags, IDCMPFlagSet,
WindowFlagSet, ScreenFlags, ScreenFlagSet, OpenScreen, IntuiMessagePtr,
OpenWindow, CloseScreen, CloseWindow, customScreen,
ClearMenuStrip, ModifyIDCMP, IntuiMessage,
SetMenuStrip, SetWindowTitles;
FROM Exec IMPORT UByte, MsgPort, MsgPortPtr, IOStdReq, IOStdReqPtr, write,
WaitPort, DoIO, GetMsg, RawDoFmt, ReplyMsg, OpenDevice,
CloseDevice, ExecBase, execBase, Message;
FROM Graphics IMPORT ViewModes, ViewModeSet,
TextAttr, TextAttrPtr, FontStyleSet,
FontFlags, FontFlagSet, RastPortPtr;
FROM ExecSupport IMPORT
CreatePort, CreateStdIO, DeletePort, DeleteStdIO;
FROM Console IMPORT
consoleName, askDefaultKeyMap, setDefaultKeyMap;
(* setKeyMap geht merkwürdigerweise nicht. Ist ja auch klar, weil
Input via IDCMP geschieht und nich via console.device!!
(Dies war Selbstkritik.) *)
FROM ConUnit IMPORT
ConUnit, ConUnitPtr;
FROM KeyMap IMPORT
KeyMapTypes, KeyMapTypeSet, DeadPrefixBytes, DeadPrefixByteSet,
vanilla, BitTable, BitTablePtr, KeyInfo, Types, TypesPtr,
Info, InfoPtr, KeyMap, KeyMapPtr;
FROM Strings IMPORT Delete, Insert;
CONST
CSI = 233C;
myAll = IDCMPFlagSet{vanillaKey, activeWindow, inactiveWindow};
VAR
oldKeyMap, newKeyMap: KeyMap;
eventEnabled: BOOLEAN;
AktiveProc: EventPROC;
ns: NewScreen;
myspt: ScreenPtr;
nw: NewWindow;
mywpt: WindowPtr;
proc: LONGCARD;
MyFont: TextAttr;
readPort, writePort: MsgPortPtr;
writeReq: IOStdReqPtr;
intP : IntuiMessagePtr;
intMsg: IntuiMessage;
cup: ConUnitPtr;
ftemp:ARRAY[0..127] OF CHAR;
itemp: ARRAY[0..7] OF CHAR;
VAR x1,y1:INTEGER; (* wegen Reihenfolge nicht ändern! *)
(* ------------------------------------------------------------ *)
PROCEDURE Length(VAR s:ARRAY OF CHAR):INTEGER;
TYPE CharPtr=POINTER TO CHAR;
VAR l:INTEGER; a:CharPtr;
BEGIN
a:=CAST(CharPtr,ADR(s));
l:=0;
WHILE a^#0C DO
INC(a);
INC(l)
END;
RETURN l
END Length;
PROCEDURE Min(x,y:INTEGER):INTEGER;
BEGIN
IF x<y THEN
RETURN x
ELSE
RETURN y
END
END Min;
(*============================================================*)
(* $E- *)
PROCEDURE HiTab(); (* aus HiTab.asm *)
BEGIN
INLINE(
(*0000*) 00000H,00000H,00000H,00000H,047F4H,0FF7FH,00000H,00000H,
(*0010*) 02200H,00100H,00101H,00080H,08080H,00080H,00303H,00303H,
(*0020*) 00101H,00101H,00101H,00101H,00101H,00505H,00000H,00001H,
(*0030*) 08080H,08080H,08080H,08080H,08080H,08080H,08080H,08080H,
(*0040*) 08080H,08080H,08080H,08080H,00000H,00128H,00000H,00008H,
(*0050*) 00000H,09E09H,00000H,0000DH,00000H,00A0DH,00000H,09F1BH,
(*0060*) 00000H,0007FH,00000H,00000H,00000H,00000H,00000H,00000H,
(*0070*) 00000H,0002DH,00000H,00000H,09A12H,08A05H,09B03H,08B18H,
(*0080*) 09D06H,08D04H,09C01H,08C13H,00000H,09080H,00000H,09181H,
(*0090*) 00000H,09282H,00000H,09383H,00000H,09484H,00000H,09585H,
(*00A0*) 00000H,09686H,00000H,09787H,00000H,09888H,00000H,09989H,
(*00B0*) 01B1BH,07B5BH,01D1DH,07D5DH,00000H,0002FH,00000H,0002AH,
(*00C0*) 00000H,0002BH,00000H,08F8EH,00000H,00000H,00000H,00000H,
(*00D0*) 00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,
(*00E0*) 00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,
(*00F0*) 00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,
(*0100*) 00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,
(*0110*) 00000H,00000H,00000H,00000H,00000H,00000H,00000H,00000H,
(*0120*) 00000H,00000H,00000H,00000H,00104H,000A0H,020B4H,0605EH,
(*0130*) 07EA8H,0B45EH,0B4B4H,0B4B4H,06060H,05E60H,06060H,00000H)
END HiTab;
PROCEDURE MakeKeyMap(VAR old,new:KeyMap);
TYPE aarr=ARRAY[0..100] OF ADDRESS;
aarrPtr=POINTER TO aarr;
VAR a:ADDRESS; aa:aarrPtr;
BEGIN
a:=ADR(HiTab);
aa:=aarrPtr(a);
aa^[48H DIV 4]:=a+0128H; (* Ptr auf Space-Tabelle *)
WITH new DO
loKeyMapTypes:=old.loKeyMapTypes;
loKeyMap:=old.loKeyMap;
loCapsable:=old.loCapsable;
loRepeatable:=old.loRepeatable;
hiKeyMapTypes:=a; INC(hiKeyMapTypes,0010H);
hiKeyMap:=a; INC(hiKeyMap,0048H);
hiCapsable:=a; INC(hiCapsable,0000H);
hiRepeatable:=a; INC(hiRepeatable,0008H);
END;
END MakeKeyMap;
(*============================================================*)
PROCEDURE SetMap(VAR k:KeyMap);
BEGIN
WITH writeReq^ DO
command:=setDefaultKeyMap;
data:=ADR(k);
length:=SIZE(k)
END;
DoIO(writeReq);
writeReq^.command:=write
END SetMap;
PROCEDURE Printable(c:CHAR):BOOLEAN;
BEGIN
RETURN ((c>=' ') AND (c<177C)) OR (c>=240C)
END Printable;
PROCEDURE WriteS(s:ARRAY OF CHAR);
BEGIN
WITH writeReq^ DO
length:=0FFFFFFFFH; (* -1 : Länge bis 0C *)
data:=ADR(s)
END;
DoIO(writeReq)
END WriteS;
PROCEDURE WriteC(c: CHAR);
BEGIN
WITH writeReq^ DO
length:=1;
data:=ADR(c)
END;
DoIO(writeReq)
END WriteC;
PROCEDURE WriteCSI(s:ARRAY OF CHAR);
BEGIN
WriteC(CSI);
WriteS(s);
END WriteCSI;
PROCEDURE WriteLn();
BEGIN
WriteC(12C)
END WriteLn;
PROCEDURE WriteL(s:ARRAY OF CHAR);
BEGIN
WriteS(s);
WriteC(12C)
END WriteL;
PROCEDURE Format(s:ARRAY OF CHAR; dats:ADDRESS);
BEGIN
RawDoFmt(ADR(s),dats,ADR(proc),ADR(ftemp));
WriteS(ftemp);
END Format;
PROCEDURE FormatE(s:ARRAY OF CHAR; dats:ADDRESS);
BEGIN
RawDoFmt(ADR(s),dats,ADR(proc),ADR(ftemp));
ftemp[0]:=CSI;
WriteS(ftemp);
END FormatE;
PROCEDURE WriteInt(i:LONGINT;l:CARDINAL);
BEGIN
itemp:='% ld';
IF l<10 THEN itemp[1]:=CHAR(l+30H) ELSE itemp[1]:='8' END;
Format(itemp,ADR(i))
END WriteInt;
PROCEDURE WriteCard(i:LONGCARD;l:CARDINAL);
BEGIN
itemp:='% ld';
IF l<10 THEN itemp[1]:=CHAR(l+30H) ELSE itemp[1]:='8' END;
Format(itemp,ADR(i))
END WriteCard;
PROCEDURE WriteHex(i:LONGINT;l:CARDINAL);
BEGIN
itemp:='%0 . lx';
IF l<10 THEN
itemp[2]:=CHAR(l+30H);
itemp[4]:=CHAR(l+30H)
ELSE
itemp[2]:='8';
itemp[4]:='8'
END;
Format(itemp,ADR(i))
END WriteHex;
PROCEDURE Sleep();
BEGIN
WaitPort(readPort);
END Sleep;
PROCEDURE MayGetC(VAR c:CHAR):BOOLEAN;
VAR temp:BOOLEAN;
BEGIN
intP:=GetMsg(readPort);
IF intP=NIL THEN
c:=0C;
temp:=FALSE
ELSE
intMsg:=intP^;
ReplyMsg(intP);
WITH intMsg DO
IF vanillaKey IN class THEN
c:=CHAR(code);
temp:=TRUE
ELSIF activeWindow IN class THEN
SetMap(newKeyMap);
temp:=FALSE
ELSIF inactiveWindow IN class THEN
SetMap(oldKeyMap);
temp:=FALSE
ELSE
IF eventEnabled THEN
execMessage.replyPort:=NIL; (* sicher ist sicher!! *)
AktiveProc(intMsg)
END;
temp:=FALSE
END;
END;
END;
RETURN temp
END MayGetC;
PROCEDURE ReadC():CHAR;
VAR temp:CHAR;
BEGIN
REPEAT
Sleep();
UNTIL MayGetC(temp);
RETURN temp
END ReadC;
PROCEDURE ReadLn(VAR s:ARRAY OF CHAR; VAR term:CHAR);
VAR i,l,max,x,y,pos,oldlength,linelength:INTEGER;
ch:ARRAY [0..1] OF CHAR;
BEGIN
ch[1]:=0C;
l:=Length(s); max:=Min(HIGH(s),cup^.xMax-cup^.xCP-1);
x:=cup^.xCP; y:=cup^.yCP;
linelength:=x+max+1;
oldlength:=cup^.xMax+1;
(* WriteCSI('42m');*) (* bg 2 *)
FormatE(' %du',ADR(linelength));
WriteS(s);
ClearEOL;
pos:=l;
LOOP
GotoXY(x+pos,y);
ch[0]:=ReadC();
IF Printable(ch[0]) THEN
IF l<max THEN
Insert(s,pos,ch) ; INC(l); WriteCSI('@'); WriteC(ch[0]); INC(pos)
END
ELSE
CASE ch[0] OF
| cLeft: IF pos>0 THEN DEC(pos) END;
| cRight: IF pos<l THEN INC(pos) END;
| scLeft: pos:=0;
| scRight: pos:=l;
| 33C: s:=''; GotoXY(x,y); ClearEOL;
pos:=0; l:=0;
| kDel: IF pos<l THEN Delete(s,pos,1); WriteCSI('P'); DEC(l) END;
| 10C: IF pos>0 THEN DEC(pos); Delete(s,pos,1); GotoXY(x+pos,y);
WriteCSI('P'); DEC(l) END;
| 15C,cDown,cUp: term:=ch[0];
EXIT;
| ELSE (* nichts *)
END; (* case *)
END; (* if printable *)
END; (* LOOP *)
(* WriteCSI('0m');*)
FormatE(' %du',ADR(oldlength));
WriteLn
END ReadLn;
(* ------------------------------------------------------------ *)
PROCEDURE GotoXY(x,y:INTEGER);
BEGIN
(*x1:=x+1; y1:=y+1;*)
INC(x); INC(y);
FormatE(' %d;%dH',ADR(y))
END GotoXY;
PROCEDURE CurOn();
BEGIN
WriteCSI(' p')
END CurOn;
PROCEDURE CurOff();
BEGIN
WriteCSI('0 p')
END CurOff;
PROCEDURE WrapOn();
BEGIN
WriteCSI('?7h')
END WrapOn;
PROCEDURE WrapOff();
BEGIN
WriteCSI('?7l')
END WrapOff;
PROCEDURE ScrollOn();
BEGIN
WriteCSI('>1h')
END ScrollOn;
PROCEDURE ScrollOff();
BEGIN
WriteCSI('>1l')
END ScrollOff;
PROCEDURE DelLine();
BEGIN
WriteCSI('M')
END DelLine;
PROCEDURE InsLine();
BEGIN
WriteCSI('L')
END InsLine;
PROCEDURE CurX():INTEGER;
BEGIN
RETURN cup^.xCP
END CurX;
PROCEDURE CurY():INTEGER;
BEGIN
RETURN cup^.yCP
END CurY;
PROCEDURE ClearWindow();
BEGIN
WriteC(14C);
END ClearWindow;
PROCEDURE CurMax(VAR x,y:INTEGER);
BEGIN
WITH cup^ DO
x:=xMax;
y:=yMax
END;
END CurMax;
PROCEDURE Title(VAR s:ARRAY OF CHAR);
BEGIN
SetWindowTitles(mywpt,-1,ADR(s))
END Title;
PROCEDURE ClearEOL();
BEGIN
WriteCSI('K')
END ClearEOL;
PROCEDURE ClearEOS();
BEGIN
WriteCSI('J')
END ClearEOS;
PROCEDURE Colour(fg,bg:Colours;style:Style);
VAR b,f,s:INTEGER;
BEGIN
b:=bg+40; f:=fg+30; s:=INTEGER(style);
FormatE(' %d;%d;%dm',ADR(s))
END Colour;
PROCEDURE NormColours();
BEGIN
WriteCSI('0m') (* setzt auch fg1, bg0 *)
END NormColours;
PROCEDURE EventProcedure(EProc:EventPROC;
Flags:IDCMPFlagSet;
menuPtr:ADDRESS);
BEGIN
ClearMenuStrip(mywpt);
IF EProc#NIL THEN
eventEnabled:=TRUE;
AktiveProc:=EProc;
IF menuPtr#NIL THEN
ModifyIDCMP(mywpt,Flags+myAll+IDCMPFlagSet{menuPick});
Assert(SetMenuStrip(mywpt,menuPtr),
ADR('TextWindow: Menü nicht anzubringen'));
ELSE
ModifyIDCMP(mywpt,Flags+myAll);
END
ELSE
eventEnabled:=FALSE;
ModifyIDCMP(mywpt,myAll)
END
END EventProcedure;
PROCEDURE GetWindow():WindowPtr;
BEGIN
RETURN mywpt
END GetWindow;
PROCEDURE GetRastPort():RastPortPtr;
BEGIN
RETURN mywpt^.rPort
END GetRastPort;
PROCEDURE Init();
BEGIN
eventEnabled:=FALSE;
proc:=16C04E75H; (* move.b d0,(a3)+ RTS *)
mywpt:=NIL;
myspt:=NIL;
writePort:=NIL;
writeReq:=NIL;
WITH MyFont DO
name:=ADR("topaz.font");
ySize:=8;
style:=FontStyleSet{};
flags:=FontFlagSet{romFont}
END;
WITH ns DO
leftEdge:=0; topEdge:=0;
width:=640;
IF execBase^.vBlankFrequency<55 THEN
height:=260 (* PAL *)
ELSE
height:=204 (* NTSC *)
END;
depth:=2; detailPen:=0; blockPen:=1;
viewModes:=ViewModeSet{hires}; type:=customScreen;
font:=ADR(MyFont);
defaultTitle:=ADR("TextScreen 1.1");
gadgets:=NIL; customBitMap:=NIL;
END;
myspt:=OpenScreen(ns);
Assert(myspt#NIL,ADR("Screen nicht zu öffnen!"));
WITH nw DO
leftEdge:=00; topEdge:=12;
width:=640; height:=myspt^.height-12;
detailPen:=0; blockPen:=1;
idcmpFlags:=myAll;
flags:=WindowFlagSet{simpleRefresh, noCareRefresh,
activate,backDrop,borderless};
firstGadget:=NIL; checkMark:=NIL;
title:=NIL; screen:=myspt; bitMap:=NIL;
minWidth:=width; minHeight:=height;
maxWidth:=width; maxHeight:=height;
type:=customScreen;
END;
mywpt:=OpenWindow(nw);
Assert(mywpt#NIL,ADR("Window nicht zu öffnen!"));
readPort:=mywpt^.userPort;
writePort:=CreatePort(ADR("myWritePort"),0);
Assert(writePort#NIL,ADR("writePort nicht zu öffnen!"));
writeReq:=CreateStdIO(writePort);
Assert(writeReq#NIL,ADR("IOwriteReq nicht zu öffnen!"));
writeReq^.data:=mywpt;
writeReq^.length:=SIZE(mywpt^);
writeReq^.device:=NIL;
OpenDevice(ADR("console.device"),0,writeReq,LONGSET{});
cup:=CAST(ConUnitPtr,writeReq^.unit);
Assert(writeReq^.device#NIL,ADR("console.device openErr"));
WITH writeReq^ DO
command:=askDefaultKeyMap;
data:=ADR(oldKeyMap);
length:=SIZE(oldKeyMap)
END;
DoIO(writeReq);
Assert(writeReq^.error=0,ADR("askDefaultKeyMap err"));
MakeKeyMap(oldKeyMap,newKeyMap);
SetMap(newKeyMap); (* setzt auch .command auf write *)
END Init;
PROCEDURE Exit();
BEGIN
IF writeReq#NIL THEN
SetMap(oldKeyMap);
CloseDevice(writeReq);
DeleteStdIO(writeReq);
writeReq:=NIL
END;
IF writePort#NIL THEN
DeletePort(writePort);
writePort:=NIL
END;
IF mywpt#NIL THEN
ClearMenuStrip(mywpt);
CloseWindow(mywpt);
mywpt:=NIL
END;
IF myspt#NIL THEN
CloseScreen(myspt);
myspt:=NIL
END;
END Exit;
BEGIN
TermProcedure(Exit);
Init;
END TextWindow.mod